package com.example.liuweather.android;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

/**
 * 实现点击EditText以外的区域，使其让编辑框失去焦点
 */
public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        // Android 5.0及以上的系统才支持
        if (Build.VERSION.SDK_INT >= 21) {
            // 获取顶级视图：不包括状态栏 从标题栏开始的整个屏幕
            View decorView = getWindow().getDecorView();
            // 活动的布局显示在状态栏上面
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            // 设置状态栏颜色为透明
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
    }
    /**
     * 触摸事件分发
     * */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(ev.getAction() == MotionEvent.ACTION_DOWN){
            // 获取当前焦点的视图
            View v = getCurrentFocus();
            if(isloseFocus(v,ev)){
                // 失去焦点
                v.clearFocus();
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    private boolean isloseFocus(View v, MotionEvent ev) {
        if(v != null &&(v instanceof EditText)){
            //获取输入框当前的location位置
            int[] leftTop = new int[2];
            /*
            可以用getLocationOnScreen获取该点到屏幕的位置，包括状态栏
            也可以getLocationInWindow 获取控件的相对与当前窗口的位置可以用getLocationInWindow，如果控件在dialog中，则当前窗口就是该dialog
             */
            v.getLocationOnScreen(leftTop);
            int left = leftTop[0],top = leftTop[1],bottom = top + v.getHeight(),right = left + v.getWidth();
            // 点击位置是否在编辑框中
            // 用getLocationInWindow，这里要用getX,getY
            if (ev.getRawX() > left && ev.getRawX() < right && ev.getRawY() > top && ev.getRawY() < bottom) {
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
}